Computer virtualization is a technique that involves encapsulating a physical computing machine platform into a virtual machine (VM) that executes under the control of virtualization software on a hardware computing platform or a “host.” The VM has both virtual hardware and a “guest” operating system (OS). The virtual hardware of a VM typically includes a least one “virtual disk,” that is generally stored on the host platform or on a remote networked storage device as a single file or a set of files (referred to herein as a “virtual disk file”). Although stored as a file or set of files, the virtual disk appears as a typical physical storage drive to the guest OS and, from the perspective of the guest OS, operates in a similar manner to such typical physical storage drives, storing the guest OS, application programs, application data and the like.
The virtualization software, also generally referred to as a “hypervisor,” manages the guest OS's access to the virtual disk and maps the virtual disk to the underlying physical storage resources that reside on the host platform or in a remote networked storage device, such as a storage area network (SAN) or network attached storage (NAS). In particular, the hypervisor may include or otherwise interact with a file system (sometimes referred to as a “virtual machine file system”) that manages how virtual disk files are stored in the underlying physical storage. In some implementations, this virtual machine file system is one of a number of software layers in the hypervisor (sometimes referred to as an “IO stack”) that ensure that IO requests issued by applications in the VM to the virtual disk ultimately reach the physical storage system that stores the virtual disk file or files. The top layer of the IO stack for example, generally receives an IO request, which includes the specific read and write requests generated by an application in the VM, when the IO request is passed by the guest OS to the VM's virtual hardware (e.g., as a SCSI read or write block request to a virtual host bus adapter of the VM, for example) and into the hypervisor. Each layer of the IO stack receives the IO request in a form that may have been transformed by the previous layer and may perform its own transformation on the IO request as well as other related operations in order to correctly route the IO request to the appropriate virtual disk file and location therein.
Due to the complexities of virtualization, layers of an IO stack may need to execute additional IO operations in order to properly perform the actual read or write IO request that has been originally issued from an application in the VM. For example, a layer in the IO stack, upon receiving an IO request from an upper layer, may transform the IO request by actually splitting the IO request into multiple further IO requests to be further passed down the IO stack. A layer in the IO stack may split an IO request, for example, because the particular virtual disk may actually comprise a set of files that each may need to be examined to determine which of the files actually stores the data relevant to the IO request. A virtual disk comprising multiple files may, for example, share a read-only base, parent or golden master virtual disk file with a number of other virtual disks and further comprise an additional “delta disk” file to store any additional data or modifications that differ from the contents of the base virtual disk file. In order to find data in the virtual disk, a particular layer of the IO stack may need to check for the presence of the data first in the delta disk, and if the data does not exist in the delta disk file, then check for it in the base virtual disk file, resulting in multiple IO requests (that stem from a single original IO request from the application in the VM). Similarly, due to the particular organization or format of data within virtual disks and delta disks, certain layers of an IO stack may need to perform additional IO operations to update metadata stored in the virtual disk or delta disk file that, for example, stores information on how to find data stored in the virtual disk file (e.g., in the event the IO request is a request to write data into a virtual disk file). Certain layers of the IO stack may conduct further IO operations to perform related additional tasks, such as “journaling” an IO request into a region of the virtual machine file system to maintain crash consistency, such as for backup and failover purposes. As should be recognized, all the additional IO operations that may be performed by various layers of the IO stack in order to simply execute a single IO request originating from an application in the VM can significantly slow the ultimate completion of an IO request due in part to the processing overhead that occurs with from such additional IO operations.